// 1813. [暴力模拟] 用给定的数字组成IP地址
// https://oj.rnd.huawei.com/problems/1813/details
// itoa(i, buf, 10);非标准c++函数,是windows
// unsigned long long 或 size_t
//一个IPv4地址可用点分十进制表示，格式为x1.x2.x3.x4，对合法的定义简化为：
// x1、x2、x3、x4 的合法范围均为 [0, 255]，分隔符是字符.。
//不考虑IP地址的具体含义，比如 0.0.0.0、255.255.255.255也是合法的。
//现给定一个仅含数字字符的字符串，请问由这些数字字符配合分隔符共能组合成多少个不同的IPv4地址？
//约定：每个数字字符可以重复使用。
// ip地址的每段不含前导零， 8.8.8.8 和 08.08.008.008
// 是相同的IP地址，其转换为十进制数后也是相同的。 输入
//一个字符串，仅为数字字符且彼此不重复。字符串长度范围[1, 10] 输出
//一个整数，表示符合要求的的IPv4地址的数量。 输入 23 输出 10000 由 2、3
//能够组合成 10 个不同的 0~255 的整数，分别为：
// 2、3、22、23、32、33、222、223、232、233。
//该IP地址的每个字段都有10种组合，那么四个字段共有10000（即10^4）个不同的IPv4地址。
// 方法1. C++ 0ms 检查0-255每一个数即可 注意数据类型为long long

#include <bits/stdc++.h>
using namespace std;

#define DEBUG
#ifdef DEBUG
#define PF(...) printf(__VA_ARGS__)
#else
#define PF(...)
#endif

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <iostream>
#include <string>
using namespace std;

class Solution {
 public:
  struct IpNum {
    char a = 0, b = 0, c = 0;
  };
  unsigned long long GetIpCount(const std::string& numChars_) {
    unsigned long long count = 0;
    for (int i = 0; i < 256; i++) {
      char buf[16] = {0};
      sprintf(buf, "%d", i);
      bool bFound = true;
      for (int j = 0; j < strlen(buf); j++) {
        size_t pos = numChars_.find(buf[j]);
        if (pos == string::npos) {
          bFound = false;
          break;
        }
      }
      if (bFound) count++;
    }
    return count * count * count * count;
  }
};

// 以下为考题输入输出框架，此部分代码不建议改动
inline std::string ReadWord() {
  std::string word;
  std::cin >> word;
  return word;
}

int main() {
  PF("%llu\n", sizeof(unsigned long long));
  std::string numChars = ReadWord();
  Solution solu;
  unsigned long long result = solu.GetIpCount(numChars);
  std::cout << result;

  return 0;
}
